
import java.io.IOException;
import java.util.ArrayList;

public class Pere extends Thread {

    private Process process;
    //private Tampon tamponDEmission;
    private ArrayList<Tampon> tableauTamponEmission;
    private Tampon tamponDeTrace;
    private Tampon tamponDeReception;
    private HorlogeLamport horloge;
    private boolean testTirage = false;
    private int numTirage;

    public Pere(Process _process) {
        this.process = _process;
        //this.tamponDEmission = this.process.getTamponDEmission();
        tableauTamponEmission=this.process.getTableauTamponEmetteur();
        this.tamponDeTrace = this.process.getTamponDeTrace();
        this.tamponDeReception = this.process.getTamponDeReception();
        this.horloge = this.process.getHorloge();
    }

   @Override
    public void run() {
        MessageUtile message = null;
        boolean test = true;
        
        // Chaque process tire son numéro pour participer à l'élection
        numTirage = (int) (Math.random() * 10);
        System.out.println(this.process.getIdProcess() + ": Numéro aléatoire du process  : " + this.numTirage);

        //Le process 1 démarre l'élection
        if (this.process.getIdProcess() == 1) {
            MessageUtile messageElection = new MessageUtile("ELEC", this.process.getIdProcess(), this.process.getIdProcess(), this.numTirage, 1);
            envoiMessage(messageElection,2);
        }

        while (test) {
            System.out.println(process.getIdProcess() + " : Pere      : Attente d'un message ---------------------------> " + horloge.getCompteur());
            message = receptionMessage();

            if (message.getContenu().equals("Fin")) {
                System.out.println("Fermeture du thread p�re du processus " + process.getIdProcess());
                MessageUtile messageFin = new MessageUtile("Fin", 0, 0);
                
                if (process.getIdProcess() == 1) {
                    envoiMessage(messageFin, 2);
                } else if (process.getIdProcess() == 2){
                    envoiMessage(messageFin, 3);
                }
                else
                {
                    envoiMessage(messageFin, 1);
                }
                test = false;
            } else {
                // Si l'id recu est égale à l'id du process fermeture il a gagné
                if (message.getIdProcessGagnant() == this.process.getIdProcess()) {
                    System.out.println(process.getIdProcess() + " : Pere      : Fermeture du SVG -------------------------------> " + horloge.getCompteur());
                    MessageUtile messageFin = new MessageUtile("Fin", 0, 0);
                     if (process.getIdProcess() == 1) {
                    envoiMessage(messageFin, 2);
                } else if (process.getIdProcess() == 2){
                    envoiMessage(messageFin, 3);
                }
                else
                {
                    envoiMessage(messageFin, 1);
                }
                } // Sinon suite de l'élection
                else {
                    MessageUtile messageElection = null;
                    horloge.incrementeHorloge();
                    // Si nombre dans le message supérieur alors envoi du même message
                    if (message.getNombre() > this.numTirage) {
                        messageElection = new MessageUtile("ELEC", process.getIdProcess(), message.getIdProcessGagnant(), message.getNombre(), horloge.getCompteur());

                    } // Sinon le process met ses infos à lui
                    else {
                        messageElection = new MessageUtile("ELEC", process.getIdProcess(), this.process.getIdProcess(), numTirage, horloge.getCompteur());
                    }
                                    if (process.getIdProcess() == 1) {
                    envoiMessage(messageElection, 2);
                } else if (process.getIdProcess() == 2){
                    envoiMessage(messageElection, 3);
                }
                else
                {
                    envoiMessage(messageElection, 1);
                }
                }
            }
        }
    }

    public void envoiMessage(Message message, int idProcessDestinataire) {
        
        int indiceTabThreadEmetteur=0;
        for (int i=0;i<this.process.getTableauEmetteur().size();i++)
        {
            if (this.process.getTableauEmetteur().get(i).getIdProcessDistant()==idProcessDestinataire)
            {
                indiceTabThreadEmetteur=i;
                i=this.process.getTableauEmetteur().size();
            }
        }
        tableauTamponEmission.get(indiceTabThreadEmetteur).setElementTampon(message);
        //tamponDEmission.setElementTampon(message);
        //horloge.incrementeHorloge(); 
        System.out.println(process.getIdProcess() + " : Pere      : Envoi d'un message -----------------------------> " + horloge.getCompteur());
    }

    public MessageUtile receptionMessage() {
        MessageUtile message = (MessageUtile) tamponDeReception.getElementTampon();
        horloge.incrementeHorloge(message.getEstampille());
        envoiTrace(message);
        System.out.println(process.getIdProcess() + " : Pere      : Reception d'un message -------------------------> " + horloge.getCompteur());
        return message;
    }

    public void envoiTrace(MessageUtile message) {
        System.out.println(process.getIdProcess() + " : Pere      : Tracer --> " + message);
        Message ordre = new MessageOrdre(message.getContenu(), message.getIdProcess(), this.process.getIdProcess(), message.getEstampille(), this.horloge.getCompteur());
        tamponDeTrace.setElementTampon(ordre);
        System.out.println(process.getIdProcess() + " : Pere      : Envoi de --> " + ordre);
    }

    public void changeTestTirage() {
        this.testTirage = true;
    }

    public void setNumTirage(int num) {
        this.numTirage = num;
    }
}
